package com.kakarote.admin.service;

import com.alibaba.fastjson.JSONObject;
import com.kakarote.admin.entity.BO.*;
import com.kakarote.admin.entity.PO.AdminUser;
import com.kakarote.admin.entity.VO.*;
import com.kakarote.common.log.entity.OperationLog;
import com.kakarote.core.entity.AdminUserQueryBO;
import com.kakarote.core.entity.BasePage;
import com.kakarote.core.entity.UserInfo;
import com.kakarote.core.feign.admin.entity.AdminUserInfo;
import com.kakarote.core.feign.admin.entity.SimpleUser;
import com.kakarote.core.servlet.BaseService;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author zhangzhiwei
 * @since 2020-04-27
 */
public interface IAdminUserService extends BaseService<AdminUser> {

    /**
     * 通过用户名查询用户
     *
     * @param username:用户名
     * @param request:HttpServletRequest
     * @return
     */
    public List<AdminUserInfo> findByUsername(String username, Long companyIdLogin, HttpServletRequest request);





    /**
     * 查询企业下所有用户
     *
     * @param adminUserBO 业务对象
     * @return ids
     */
     BasePage<AdminUserVO> queryUserList(AdminUserBO adminUserBO);


    /**
     * 记录用户数量根据label
     *
     * @param
     * @return data
     */
     JSONObject countUserByLabel();

    /**
     * 查询该用户下级的用户
     *
     * @param userId 用户ID 0代表全部
     * @return data
     */
     List<Long> queryChildUserId(Long userId);

    /**
     * 修改用户
     *
     * @param adminUserVO data
     * @return 企业微信userId
     */
     OperationLog setUser(AdminUserVO adminUserVO);

    /**
     * 批量修改用户部门
     *
     * @param adminUserBO:用户列表查询
     */
     List<OperationLog> setUserDept(AdminUserBO adminUserBO);

    /**
     * 新增用户
     *
     * @param adminUserVO data
     */
     JSONObject addUser(AdminUserVO adminUserVO);

    /**
     * 修改用户信息
     *
     * @param adminUser
     */
     void updateUser(AdminUser adminUser);

    /**
     * 修改用户账号功能
     *
     * @param id       用户ID
     * @param username 新的用户名
     * @param password 新的密码
     * @return 操作状态
     */
     OperationLog usernameEdit(Long id, String username, String password);


    /**
     * excel导入员工
     *
     * @param file file
     * @return data
     */
     JSONObject excelImport(MultipartFile file);

    /**
     * 设置状态
     *
     * @param adminUserStatusBO status
     */
     List<OperationLog> setUserStatus(AdminUserStatusBO adminUserStatusBO);

    /**
     * 重置密码
     *
     * @param adminUserStatusBO status
     */
     List<OperationLog> resetPassword(AdminUserStatusBO adminUserStatusBO);

    /**
     * 根据用户ID查询角色ID
     *
     * @param userId userId
     * @return ids
     */
     List<Long> queryUserRoleIds(Long userId);

    /**
     * 通讯录查询
     *
     * @param userBookBO data
     * @return data
     */
     BasePage<UserBookVO> queryListName(UserBookBO userBookBO);

    /**
     * 查询组织架构下员工信息
     *
     * @return 组织架构信息
     */
     AdminOrganizationVO queryOrganizationInfo();

    /**
     * 切换关注状态
     *
     * @param userId 用户ID
     * @return data
     */
     void attention(Long userId);

    /**
     * 根据ids查询用户信息
     *
     * @param ids id列表
     * @return data
     */
     List<SimpleUser> queryUserByIds(List<Long> ids);

    /**
     * 查询正常用户根据id
     *
     * @param ids
     * @return id
     */
     List<Long> queryNormalUserByIds(List<Long> ids);

    /**
     * 根据部门ids查询用户列表
     *
     * @param ids id列表
     * @return data
     */
     List<Long> queryUserByDeptIds(List<Long> ids);

    /**
     * 根据部门ID查询用户
     *
     * @param deptIds
     * @return
     */
    List<SimpleUser> queryListByDeptIds(List<Long> deptIds);

    /**
     * 人力资源增加用户
     *
     * @param hrmAddUserBO
     * @return
     */
    List<OperationLog> hrmAddUser(HrmAddUserBO hrmAddUserBO);

    /**
     * 查询部门用户
     *
     * @param isAllUser
     * @param deptId:部门id
     * @return
     */
    DeptUserListVO queryDeptUserList(Long deptId, boolean isAllUser);

    /**
     * 查询部门用户根据hrm
     *
     * @param deptUserListByHrmBO
     * @return 用户对象
     */
    Set<HrmSimpleUserVO> queryDeptUserListByHrm(DeptUserListByHrmBO deptUserListByHrmBO);

    /**
     * 查询用户id根据名字
     *
     * @param realNames:名字
     * @return
     */
    List<Long> queryUserIdByRealName(List<String> realNames);

    /**
     * 查询用户id根据用户姓名与公司id
     *
     * @param username:用户名
     * @param companyId:公司id
     * @return
     */
    Long queryUserIdByUserNameAndCompanyId(String username);

    /**
     * 查询登录用户
     *
     * @param userId:用户id
     * @return UserInfo
     */
    UserInfo queryLoginUserInfo(Long userId);

    /**
     * 根据手机号和公司id查询用户
     *
     * @param phone:手机号
     * @param companyId:公司id
     * @return
     */
    List<AdminUser> queryByUserName(String phone);

    /**
     * 查询所有员工
     *
     * @return
     */
     List<UserInfo> queryAllUserInfoList();

    /**
     * 下载员工导入模板
     *
     * @param response:HttpServletResponse
     * @throws IOException:下载模板io异常
     */
     void downloadExcel(HttpServletResponse response) throws IOException;

    /**
     * 查询用户、角色、部门信息
     *
     * @param requestBO
     * @return
     */
    UserInfoVO queryUserDeptOrRoleInfo(UserInfoRequestBO requestBO);


    /**
     * 获取指定用户的上级用户
     *
     * @param queryBO
     * @return
     */
    List<UserInfo> queryParentByLevel(AdminUserQueryBO queryBO);

    /**
     * 清空用户缓存
     *
     * @param userIds 用户ID列表
     */
    void clearUserCache(Long... userIds);





    /**
     * 绑定企业微信userId
     *
     * @param wxUserId 企业微信userId
     */
    SimpleUser bindingWxWorkUserId(String token, String wxUserId);

    void unbindingWxWorkByUserId(Long userId);


    /**
     * 导出excel
     *
     * @param response response
     * @param userIds  用户列表，为空代表全部
     */
     void exportExcel(HttpServletResponse response, List<Long> userIds);

    /**
     * 根据部门ids查询部门以及子部门用户列表
     *
     * @param ids id列表
     * @return data
     */
    List<Long> queryUserListByDeptIds(List<Long> ids);

    /**
     * 密码是否过期判断
     *
     * @return
     */
    JSONObject resetPwdNotice();

    /**
     * 更新最新密码登录时间
     *
     * @param username
     */
    void updateAdminUserLoginTime(String username);

    /**
     * 获取最近一次用户登录信息
     *
     * @param username
     * @return
     */
    Map<String, Object> getLastedLoginUser(String username);

    /**
     * 批量更新密码是否需要修改状态
     *
     * @param users
     */
    void batchUpdPasswordUpdStatus(List<AdminUser> users);

    /**
     * 是否强制更新密码判断
     *
     * @return
     */
    JSONObject forceResetPwdNotice();

    /**
     * *验证移动端是否免登录  true 是
     *
     * @return
     */
    JSONObject mobileSSOCheck();
}
